superApp.controller('userCreateController', ['$scope', '$location', '$timeout', 'UserService', '$log',

	/**
	 *	@param $scope scope del controlador
	 *	@param UserService servicio para utilizar ngResource y realizar las 
	 *	operaciones CRUD en el servidor.
	 */
	function($scope, $location, $timeout, UserService, $log) {
		$scope.user = {};
		$scope.usernameExists = false;

		$scope.createUser = function () {

			if (validateForm($scope.superform) && !$scope.usernameExists) {

				UserService.crud.save($scope.user, function() {
					$timeout(function() {
						$location.path('/users');
					});
				});
			}
		};

		/**
		*	Función responsable de verificar si el "username" del usuario
		*	esta dispobible o no.
		*/
		$scope.checkUsername = function() {

			var isUsernameEmpty = $scope.UtilitiesFactory.isEmpty($scope.user.username);

			if (!isUsernameEmpty) {
				var usernameValidationInfo = UserService.validations.checkUsernameExists({
					username: $scope.user.username
				}, function (response) {
					if (response.usernameExists) {
						// el nombre de usuario a existe
						$scope.usernameExists = true;
					} else {
						$scope.usernameExists = false;
					}
				});
			}
		};

		/**
		*	Función responsable de verificar que los password coincidan
		*	y cumplan con una seguridad específica.
		*/
		$scope.checkPassword = function () {
			// se valida que los passwords coincidan
			var matchPasswords = $scope.UtilitiesFactory.matchStrings($scope.user.password, $scope.user.passwordConfirm);

			// se valida el nivel de seguridad de los passwords
			
		};

		function validateForm(formToValidate) {
			var isValidForm = true;

			// se valida que el formulario no este vacio
			if (!formToValidate || (formToValidate == null)) {
				isValidForm = false;				
			} else {
				for(var formItemKey in formToValidate) {

				    var formItem = formToValidate[formItemKey];
				    
					for (var prop in formItem) {
						// solo los inputs del form tienen la propiedad $dirty
						if (prop == '$invalid' && formItem[prop]) {
							if (isValidForm) {
								//  si isValidForm es true, quiere decir que es el 
								// 	primer elemento inválido encontrado, se le hace focus
								
							}
							// la validación del form falla
							isValidForm = false;
							// se "ensucia" el campo para que se muestren los msjs de error
							formToValidate[formItemKey].$dirty = true;
						}
					}
				}				
			}

			return isValidForm;
		}


		$scope.displayDOBMessages = function () {
			var displayErrorMessage = false;

			var birthdateIsDirty = ($scope.superform.day.$dirty 
				&& $scope.superform.month.$dirty && $scope.superform.year.$dirty);

			// si hay dia, mes o anio es vacio y ya han interactuado con estos, se muestra el mensaje
			if (!($scope.user.day && $scope.user.month && $scope.user.year) && birthdateIsDirty) {
				displayErrorMessage = true;
			} 

			return displayErrorMessage;
		};
	}]
);